parser grammar XMLParser;

options {
  language = Java;
  tokenVocab = XMLLexer;
}

@header {
  package PracticasPL.practica9;
  import java.util.ArrayList;
  import java.util.Iterator;
}

@members {
      //Lista que guarda los errores que se van produciendo durante el analisis lexico
    List<RecognitionException> errors = new ArrayList<RecognitionException>();

    //Metodo que devuelve la lista de errores que se han producido
    public List<RecognitionException> getAllErrors() {
        return errors;
    }
    
    //Metodo que comprueba si se han producido errores
    public boolean hasErrors() {
        return !errors.isEmpty();
    }
    //Metodo del analizador lexico sobrescrito para que los errores que se van
    //produciendo durante el analisis lexico en vez de mostrarse por consola
    //se guarden en la lista de errores (errors)
    @Override
    public void reportError(RecognitionException e) {
        errors.add(e);
    }
   //public boolean hayTitulo = false;
   ArrayList<Boolean> etiquetasLibro; 
}

biblioteca returns[boolean excepcion = false] : tag=INICIO_TAG libro+ tag2=FIN_TAG
{ 
  
//  System.out.println("Token 1: " +$tag.text);
//  System.out.println("Token 2: " +$tag2.text);
  String tag_inicio = $tag.text;
  String tag_cierre = $tag2.text;
  if(tag_cierre == null) throw new RecognitionException();
  tag_inicio = tag_inicio.replace("<", "");
  tag_inicio = tag_inicio.replace(">", "");
  tag_cierre = tag_cierre.replace("</", "");
  tag_cierre = tag_cierre.replace(">", "");
  if(!tag_inicio.equals(tag_cierre)) throw new RecognitionException();
}
;
catch [RecognitionException e] {
  excepcion = true;
  System.err.println("El tag <biblioteca> no tienene su tag de cierre correspondiente"); 
}

libro returns[boolean excepcion = false, boolean autorExcepcion = false] 
@init 
{
  boolean hayAutor = false;
  boolean etiquetasErroneas = false;
  etiquetasLibro = new ArrayList<Boolean>();
  
}
: tag=INICIO_TAG inf_libro+ tag2=FIN_TAG
{ 
  
//  System.out.println("Token 1: " +$tag.text);
//  System.out.println("Token 2: " +$tag2.text);
  //hayTitulo = false;
  String tag_inicio = $tag.text;
  String tag_cierre = $tag2.text;
  if(tag_cierre == null)
  {
  etiquetasErroneas = true;
   throw new RecognitionException();
   }
  tag_inicio = tag_inicio.replace("<", "");
  tag_inicio = tag_inicio.replace(">", "");
  tag_cierre = tag_cierre.replace("</", "");
  tag_cierre = tag_cierre.replace(">", "");
  if(!tag_inicio.equals(tag_cierre))
  {
   etiquetasErroneas = true;
   throw new RecognitionException();
  }
   for(Boolean i: etiquetasLibro)
   {
    if(i.booleanValue() == true){
      hayAutor = true;
      break;
    }
   }
   if(!hayAutor) throw new RecognitionException();
  //System.out.println("Hay titulo? "+ hayTitulo);
}
;
catch [RecognitionException e] {
  if(etiquetasErroneas) {
    $excepcion = true;
    System.err.println("El tag <libro> no tienene su tag de cierre correspondiente");
  }
  if(!hayAutor)
  {
    $autorExcepcion = true;
   System.err.println("Al libro le falta el autor");
  }
}

inf_libro : tag=INICIO_TAG CADENA tag2=FIN_TAG
{ 
  
//  System.out.println("Token 1: " +$tag.text);
//  System.out.println("Token 2: " +$tag2.text);
  String tag_inicio = $tag.text;
  String tag_cierre = $tag2.text;
  if(tag_cierre == null) throw new RecognitionException();
  tag_inicio = tag_inicio.replace("<", "");
  tag_inicio = tag_inicio.replace(">", "");
  tag_cierre = tag_cierre.replace("</", "");
  tag_cierre = tag_cierre.replace(">", "");
  if(!tag_inicio.equals(tag_cierre)) throw new RecognitionException();
  //System.out.println(tag_inicio);
  if(tag_inicio.equals("autor")) {
    etiquetasLibro.add(true);
  //System.out.println("Aqui");
  }else
  {
    etiquetasLibro.add(false);
   }
}
;
catch [RecognitionException e] 
{ 
System.err.println("Falta el tag de cierre para la etiqueta "+$tag.text ); 
}

